vlwkaos' digital garden

HTTP Cache - No-cache는 cache를 하라는 것이다

거의 번역글이다.

No-cache는 cache를 해라는 뜻

캐시 처리는 쉬웠던 적이 없다. 근데 HTTP 캐시 헤더는 더 햇갈린다. 그중 최악은 no-cacheprivate이다. 얘네는 뭐하는 놈들일까?

Cache-Control: private, no-cache

얼핏 보기엔, 이 요청에 대한 결과를 저장하지말고 어딘가 숨겨두라는 것 처럼 보인다.

하지만 그렇게 생각했다면 완전 틀렸다.

저 헤더의 내용은 이렇다. "이 요청에 대한 응답을 모든 브라우저에서 캐시할 것. 그러나 사용시에 재검증하세요." 그러니까 사실은 노캐시가 아니라 캐싱을 더 많이 되도록 하는 설정인 것이다.

특히 no-cache를 설정한다면 명시적으로 더욱 더 캐시해라고 말하는 것이다. 다만 브라우저나 CDN이 해당 리소스를 요청할 때 If-Match 혹은 If-Modified-Since를 동봉해서 캐시가 최신 상태인지 확인을 먼저 하라는 뜻이다.

private은 캐시는 가능하지만 말단인 브라우저(CDN이나 Proxy가 아닌)에서만 해라는 뜻이다.

캐시를 안하고 싶을땐 그럼 어떻게 해야할까.

그럴 땐 요청 헤더에 다음을 포함해야한다.

Cache-Control: no-store

하지만 사각지대가 하나 있는데, 이미 브라우저에 요청에 대한 캐시가 되어있는 경우, 그걸 없애주지는 못한다. 현재 있는 캐시까지 만료시키고자 한다면 max-age=0을 추가해야한다.

트위터가 이 문제로 골머리를 썩힌적이 있다. no-store를 써야하는 상황에 no-cache를 사용해서 유저의 개인 메세지를 브라우저 캐시에 실수로 남겨버린 것이다. 자기 컴퓨터에서만 쓴다면 문제가 되지 않지만... 공공 장소에서 트위터를 했다면 거기 사적인 메세지가 암호화도 안된채 남게 된것이다.

Referred in

HTTP Cache - No-cache는 cache를 하라는 것이다